package com.bbva.itradecomex.controller.vistaCliente;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ComponentSystemEvent;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.jsf.FacesContextUtils;

import com.bbva.itradecomex.bo.iface.ContactoClienteBO;
import com.bbva.itradecomex.bo.iface.ModalProductoBO;
import com.bbva.itradecomex.controller.ModalProductoController;
import com.bbva.itradecomex.domain.ClienteDatos;
import com.bbva.itradecomex.domain.ContactoCliente;
import com.bbva.itradecomex.domain.ReporteDetalleMDPFIA;
import com.bbva.itradecomex.domain.FinanciamientoDetalle;
import com.bbva.itradecomex.domain.MediosDePagoDetalle;
import com.bbva.itradecomex.util.Constantes;
import com.bbva.itradecomex.util.ITradexUtil;
import com.bbva.itradecomex.util.MessageProvider;

@Controller
@RequestScoped
@ManagedBean
public class ContactoClienteController {
	
	private static final Logger log = Logger.getLogger(FlujoImportacionesController.class);
	
	@Autowired
	private ContactoClienteBO contactoClienteBO;
	@Autowired
	private ModalProductoBO modalProductoBO;
	
	private List<ContactoCliente> listOCVContactoCliente;
	private ContactoCliente footerOSV;
	private String idCliente;
	
	private boolean showColumnNormal;
	
	public void onPageLoad(ComponentSystemEvent event){
		try {
			if(!FacesContext.getCurrentInstance().isPostback()){
				ModalProductoController modalProductoController = (ModalProductoController)FacesContextUtils.getWebApplicationContext(FacesContext.
							getCurrentInstance()).getBean("modalProductoController");
				modalProductoController.inicializarModalGenerico();
				modalProductoController.inicializarModalDetalleMDPFIA();
				
				inicializarValores();
				BusquedaClienteController busquedaClienteController = (BusquedaClienteController)FacesContextUtils.
						getWebApplicationContext(FacesContext.getCurrentInstance()).getBean("busquedaClienteController");
				
				idCliente = Constantes.VACIO;
				if(busquedaClienteController.getClienteSeleccionado() != null &&
						busquedaClienteController.getClienteSeleccionado().getStrCodCliente() != null){
					idCliente = busquedaClienteController.getClienteSeleccionado().getStrCodCliente();
				}
				cargarContactosDeCliente();
			}
		} catch (Exception e) {
			e.printStackTrace();
			log.error(e.getMessage(),e);
		}
	}
	
	private void cargarContactosDeCliente(){
		try{
			setListOCVContactoCliente(contactoClienteBO.getListContactosDeCliente(idCliente));
			
			if(listOCVContactoCliente != null && listOCVContactoCliente.size() > 0){
				for(int i = 0; i < listOCVContactoCliente.size(); i++){
					ContactoCliente ob = listOCVContactoCliente.get(i);
					if(ob.getIdContacto() != null && 
							(ob.getIdContacto().compareTo(new BigDecimal(0)) == 0)){ //operacion sin vinculacion	
						footerOSV = ob;
						//listOCVContactoCliente.remove(i);
						break;
					}
				}
			}
		}catch(Exception e){
			e.printStackTrace();
			log.error(e.getMessage(),e);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
					MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_GENERAL"),
					MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_GENERAL")));
		}
	}
	
	public void exportDocument(String tipoDoc){
		if(listOCVContactoCliente != null && listOCVContactoCliente.size() > 0){			
			//Detalle operaciones con vinculacion
			List<ReporteDetalleMDPFIA> listOCVDetalleContactosMDP = new ArrayList<ReporteDetalleMDPFIA>();
			List<ReporteDetalleMDPFIA> listOCVDetalleContactosFIA = new ArrayList<ReporteDetalleMDPFIA>();
			
			//Detalle operaciones sin vinculacion
			List<MediosDePagoDetalle> listOSVDetalleContactosMDP = new ArrayList<MediosDePagoDetalle>();
			List<FinanciamientoDetalle> listOSVDetalleConstactosFIA = new ArrayList<FinanciamientoDetalle>();
			
			try{
				//operaciones con vinculacion
				List<MediosDePagoDetalle> listDetalleMDP = null;
				List<FinanciamientoDetalle> listDetalleFIA = null;
				ReporteDetalleMDPFIA contactosClienteReport = null;
				
				for (ContactoCliente ob : listOCVContactoCliente) {
					listDetalleMDP = new ArrayList<MediosDePagoDetalle>();
					listDetalleFIA = new ArrayList<FinanciamientoDetalle>();
					contactosClienteReport = new ReporteDetalleMDPFIA();

					if(ob.getCdi() != null){
						listDetalleMDP.addAll(modalProductoBO.getListModalContactosClienteMDP
								(idCliente, ob.getIdContacto(), Constantes.COD_PRODUCTOMT_CDI));
					}
					if(ob.getCoi() != null){
						listDetalleMDP.addAll(modalProductoBO.getListModalContactosClienteMDP
								(idCliente, ob.getIdContacto(), Constantes.COD_PRODUCTOMT_COI));
					}
					if(ob.getCde() != null){
						listDetalleMDP.addAll(modalProductoBO.getListModalContactosClienteMDP
								(idCliente, ob.getIdContacto(), Constantes.COD_PRODUCTOMT_CDE));
					}
					if(ob.getCoe() != null){
						listDetalleMDP.addAll(modalProductoBO.getListModalContactosClienteMDP
								(idCliente, ob.getIdContacto(), Constantes.COD_PRODUCTOMT_COE));
					}					
					if(ob.getFiaImpo() != null){
						listDetalleFIA.addAll(modalProductoBO.getListModalContactosClienteFIA
								(idCliente, ob.getIdContacto(), Constantes.COD_PRODUCTOMT_FIA_I));
					}
					if(ob.getFiaExpo() != null){
						listDetalleFIA.addAll(modalProductoBO.getListModalContactosClienteFIA
								(idCliente, ob.getIdContacto(), Constantes.COD_PRODUCTOMT_FIA_E));
					}
					
					if(listDetalleMDP.size() > 0  || listDetalleFIA.size() > 0){
						contactosClienteReport.setNombre(ob.getNombre());
						if(listDetalleMDP.size() > 0){
							contactosClienteReport.setListMDPDetalle(listDetalleMDP);
							listOCVDetalleContactosMDP.add(contactosClienteReport);
						}
						if(listDetalleFIA.size() > 0){
							contactosClienteReport.setListFIADetalle(listDetalleFIA);
							listOCVDetalleContactosFIA.add(contactosClienteReport);
						}
					}
				}
				
				//operaciones sin vinculacion
				if(footerOSV != null){
					if(footerOSV.getCdi() != null){
						listOSVDetalleContactosMDP.addAll(modalProductoBO.getListModalContactosClienteMDP
								(idCliente, new BigDecimal(0), Constantes.COD_PRODUCTOMT_CDI));
					}
					if(footerOSV.getCoi() != null){
						listOSVDetalleContactosMDP.addAll(modalProductoBO.getListModalContactosClienteMDP
								(idCliente, new BigDecimal(0), Constantes.COD_PRODUCTOMT_COI));
					}
					if(footerOSV.getCde() != null){
						listOSVDetalleContactosMDP.addAll(modalProductoBO.getListModalContactosClienteMDP
								(idCliente, new BigDecimal(0), Constantes.COD_PRODUCTOMT_CDE));
					}
					if(footerOSV.getCoe() != null){
						listOSVDetalleContactosMDP.addAll(modalProductoBO.getListModalContactosClienteMDP
								(idCliente, new BigDecimal(0), Constantes.COD_PRODUCTOMT_COE));
					}					
					if(footerOSV.getFiaImpo() != null){
						listOSVDetalleConstactosFIA.addAll(modalProductoBO.getListModalContactosClienteFIA
								(idCliente, new BigDecimal(0), Constantes.COD_PRODUCTOMT_FIA_I));
					}
					if(footerOSV.getFiaExpo() != null){
						listOSVDetalleConstactosFIA.addAll(modalProductoBO.getListModalContactosClienteFIA
								(idCliente, new BigDecimal(0), Constantes.COD_PRODUCTOMT_FIA_E));
					}
				}
			}catch(Exception e){
				e.printStackTrace();
				log.error(e.getMessage(), e);
			}
			
			BusquedaClienteController busquedaClienteController = (BusquedaClienteController)FacesContextUtils.
					getWebApplicationContext(FacesContext.getCurrentInstance()).getBean("busquedaClienteController");
			
			ClienteDatos clienteDatos = busquedaClienteController.getClienteSeleccionado();
			
			if(clienteDatos == null){
				clienteDatos = new ClienteDatos();
			}
			
			Map<String,Object> parametros = new HashMap<String, Object>();
			parametros.put("clienteDatos", clienteDatos);
			parametros.put("listOCVContactoCliente", listOCVContactoCliente);
			parametros.put("footerOSV", footerOSV);
			parametros.put("listOCVDetalleContactosMDP", listOCVDetalleContactosMDP);
			parametros.put("listOCVDetalleContactosFIA", listOCVDetalleContactosFIA);
			parametros.put("listOSVDetalleContactosMDP", listOSVDetalleContactosMDP);
			parametros.put("listOSVDetalleConstactosFIA", listOSVDetalleConstactosFIA);
			
			Date mydate = new Date();
			parametros.put("dateReport", mydate);

			String nombreFile = idCliente+"_Contactos_"+ITradexUtil.convertUtilDateToString(mydate, Constantes.FORMAT_DATE_MM_DD_yyyy);
			
			if(Constantes.ARCHIVO_EXCEL.equals(tipoDoc)){
				parametros.put("isXLS", Boolean.TRUE);
				ITradexUtil.exportXLSJasperEmptyDS(parametros, "/xmlReport/cliente/contactos/ContactosCliente_excel.jasper", nombreFile);
			}else if(Constantes.ARCHIVO_PDF.equals(tipoDoc)){
				parametros.put("isXLS", Boolean.FALSE);
				ITradexUtil.exportPDFEmptyDS(parametros, "/xmlReport/cliente/contactos/ContactosCliente.jasper", nombreFile);
			}
		}
	}

	private void inicializarValores(){
		listOCVContactoCliente = null;
		footerOSV = new ContactoCliente();
	}

	public List<ContactoCliente> getListOCVContactoCliente() {
		return listOCVContactoCliente;
	}

	public void setListOCVContactoCliente(
			List<ContactoCliente> listOCVContactoCliente) {
		this.listOCVContactoCliente = listOCVContactoCliente;
	}

	public ContactoCliente getFooterOSV() {
		return footerOSV;
	}

	public void setFooterOSV(ContactoCliente footerOSV) {
		this.footerOSV = footerOSV;
	}

	public boolean isShowColumnNormal() {
		return showColumnNormal;
	}

	public void setShowColumnNormal(boolean showColumnNormal) {
		this.showColumnNormal = showColumnNormal;
	}
}
